package com.sheng.leetcode.year2022.swordfingeroffer.day02;

import org.junit.Test;

/**
 * @author liusheng
 * @date 2022/09/05
 *
 * 剑指 Offer 24. 反转链表
 *
 * 定义一个函数，输入一个链表的头节点，反转该链表并输出反转后链表的头节点。
 *
 * 示例:
 *
 * 输入: 1->2->3->4->5->NULL
 * 输出: 5->4->3->2->1->NULL
 *
 * 限制：
 *
 * 0 <= 节点个数 <= 5000
 *
 * 注意：本题与主站 206 题相同：https://leetcode-cn.com/problems/reverse-linked-list/
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/fan-zhuan-lian-biao-lcof
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Sword0024 {

    @Test
    public void test01() {
        ListNode head = new ListNode(1);
        ListNode l1 = new ListNode(3);
        l1.next = new ListNode(2);
        head.next = l1;
        ListNode listNode = new Solution24().reverseList(head);
        System.out.println(listNode);
    }
}

class Solution24 {
    public ListNode reverseList(ListNode head) {
        if (head == null) {
            return null;
        }
        ListNode listNode = null;
        while (head.next != null) {
            listNode = regenerate(listNode, head);
            head = head.next;
        }
        listNode = regenerate(listNode, head);
        return listNode;
    }

    public ListNode regenerate(ListNode listNode, ListNode head) {
        ListNode node = new ListNode(head.val);
        node.next = listNode;
        return node;
    }
}

